/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Entidades.Configuracion;
import Entidades.Equipo;
import Entidades.Medicion;
import Entidades.Subscripcionalerta;
import Entidades.Subscripcionfuncionamiento;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Luis
 */
public class FachadaPersistencia {

    private static FachadaPersistencia instancia = null;

    public static FachadaPersistencia getInstancia() {

        if (instancia == null) {
            return new FachadaPersistencia();
        } else {
            return instancia;
        }
    }

    /**
     * Guarda un objeto en la base de datos
     *
     * @param obj Object
     */
    public void guardar(Object obj) {
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        session.saveOrUpdate(obj);
        session.getTransaction().commit();
        session.close();
    }

    /**
     * Actualiza un objecto en la base de datos
     *
     * @param obj Object
     */
    public void actualizar(Object obj) {
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        session.update(obj);
        session.getTransaction().commit();
        session.close();
    }

    /**
     * Busca en la base de datos un objecto por su tipo y identificador único
     *
     * @param clase nombre de la Clase del objeto a buscar
     * @param id identificador unico del objeto
     * @return Object
     */
    public Object buscar(String clase, int id) {
        Object obj;
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        try {
            Class cls = Class.forName("Entidades." + clase);
            obj = session.get(cls, id);
            session.getTransaction().commit();
            session.close();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        return obj;

    }

    /**
     * Busca un equipo por su código de equipo
     *
     * @param cod código de equipo
     * @return Equipo
     */
    public Equipo buscarEquipo(int cod) {
        Equipo equipo;
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        equipo = (Equipo) session.createQuery("from Equipo where codigoEquipo ='" + cod + "' and idEstadoEquipo <> '3'").uniqueResult();
        session.getTransaction().commit();
        session.close();
        return equipo;
    }

    public ArrayList<Medicion> buscarMediciones(String _id, Date _time) {
        Timestamp actual = new Timestamp(new Date().getTime());
        Timestamp tiempo = new Timestamp(actual.getTime() - _time.getTime());
        tiempo.setHours(tiempo.getHours() + 3);
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        Query consulta = session.createQuery("from Medicion where idSensor ='" + _id + "' and fecha BETWEEN '" + tiempo + "' AND '" + actual + "'");
        ArrayList mediciones = (ArrayList) consulta.list();
        ArrayList<Medicion> obj = new ArrayList();
        for (int i = 0; i < mediciones.size(); i++) {
            Medicion m = (Medicion) mediciones.get(i);
            obj.add(m);
        }
        session.getTransaction().commit();
        session.close();
        return obj;

    }

    public ArrayList<Subscripcionalerta> buscarSubscripcionesDeAlerta(int idSensor) {
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        Query consulta = session.createQuery("from Subscripcionalerta where idSensor ='" + idSensor + "'");
        ArrayList subscipcionesA = (ArrayList) consulta.list();
        ArrayList<Subscripcionalerta> obj = new ArrayList();
        for (int i = 0; i < subscipcionesA.size(); i++) {
            Subscripcionalerta s = (Subscripcionalerta) subscipcionesA.get(i);
            obj.add(s);
        }
        session.getTransaction().commit();
        session.close();
        return obj;
    }

    public ArrayList<Equipo> buscarEquiposActivos() {
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        Query consulta = session.createQuery("from Equipo where idEstadoEquipo ='1'");
        ArrayList equipos = (ArrayList) consulta.list();
        ArrayList<Equipo> obj = new ArrayList();
        for (int i = 0; i < equipos.size(); i++) {
            Equipo s = (Equipo) equipos.get(i);
            obj.add(s);
        }
        session.getTransaction().commit();
        session.close();
        return obj;
    }

    public ArrayList<Subscripcionfuncionamiento> buscarSubscripcionesFuncionamiento() {
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        Query consulta = session.createSQLQuery("Select * from sd_sensor_subscripcionfuncionamiento as S inner join sd_sensor_equipo as E where S.idEquipo = E.idEquipo and estado ='Activo' and E.idEstadoEquipo='1'").addEntity(Subscripcionfuncionamiento.class);
        ArrayList subs = (ArrayList) consulta.list();
        ArrayList<Subscripcionfuncionamiento> obj = new ArrayList();
        for (int i = 0;
                i < subs.size();
                i++) {
            Subscripcionfuncionamiento s = (Subscripcionfuncionamiento) subs.get(i);
            obj.add(s);
        }

        session.getTransaction()
                .commit();
        session.close();
        return obj;
    }

    public Configuracion obtenerConfiguracion() {
        Session session = Hibernate.getSessionFactory().openSession();
        session.beginTransaction();
        Configuracion conf = (Configuracion) session.createQuery("from Configuracion").uniqueResult();
        return conf;
    }
}
